# -*-coding: Utf-8 -*-
# @File : student .py
# author: Chimengmeng
# blog_url : https://www.cnblogs.com/dream-ze/
# Time：2023/6/12

'''
学生视图层
'''
from lib import common
from interface import student_interface, common_interface

login_user_student = {
    'username': None,
    'school_name': None
}


# 注册功能
def register():
    while True:
        # （1）输入用户名和密码
        username_student = input('请输入学生姓名:>>>>').strip()

        if username_student == 'q':
            break

        password_student = input('请输入密码:>>>>').strip()
        # 二次校验密码
        re_password_student = input('请再次输入密码:>>>>').strip()

        # （2）逻辑判断，两次密码是否一致
        if password_student == re_password_student:
            # （2.1） 两次密码一致，对密码进行加密并调用管理员视图层进行注册函数
            # 获取加密需要的盐
            salt = common.get_verify_code(6)
            # 数据拼接：盐 + 二次输入的密码
            # 加密输入的密码
            encrypted_password_after = common.encrypt_decrypt(salt + re_password_student)

            # 调用接口层进行信息的判断与注册
            flag, msg = student_interface.student_register_interface(username_student, encrypted_password_after, salt)

            # 根据返回的结果进行打印输出反馈结果
            if flag:
                print(msg)
                break
            else:
                print(msg)
        else:
            # （2.2） 两次密码不一致，二次重新输入
            print('请重新校验密码!')


# 登录功能
def login():
    while True:
        # （1）用户层输入用户名和密码
        username_student = input('请输入你的学生姓名:>>>>').strip()

        if username_student == 'q':
            break

        password_student = input('请输入你的密码:>>>>').strip()
        login_code = common.get_verify_code(4)
        login_code_input = input(f'请输入验证码进行登陆::>>{login_code}::>>').strip()

        # （2）调用学生接口层中的登陆接口
        flag, msg = student_interface.student_login_interface(username_student, password_student, login_code,
                                                              login_code_input)

        # （3）对反馈的结果进行打印输出
        if flag:
            print(msg)
            # 记录当前登陆的用户名
            login_user_student['username'] = username_student
            # 调用接口层进行学生校区的校验
            # 记录当前学生已经选择的校区
            school_name, msg = student_interface.student_get_school_name(login_user_student['username'])
            if flag:
                print(msg)
                login_user_student['school_name'] = school_name
            else:
                print(msg)
            break
        else:
            print(msg)


# 选择校区
@common.auth('student')
def choose_school():
    while True:
        # (1) 获取所有学校的学校名，供学生进行选择
        flag, school_list = common_interface.get_all_school_interface()

        # (2) 判断返回的结果是否存在  ----  学校不存在的时候返回假 取反做真则打印提示语学校不存在
        if not flag:
            print(school_list)
            break

        # (3) 判断返回的结果如果存在，则对学校列表进行格式化打印输出
        for index, school_name in enumerate(school_list):
            print(f'当前学校编号:>>>>{index}  当前学校名字:>>>>{school_name}')

        # (4) 打印完学校列表让学生进行学校选择
        choice_school = input('请输入选择的学校编号:>>>>').strip()

        if choice_school == 'q':
            break

        if not choice_school.isdigit():
            print(f'请确认输入的信息!!')
            continue

        choice_school = int(choice_school)

        if choice_school not in range(len(school_list)):
            flow = f'请输入正确的学校编号!!'
            continue

        # （5）开始调用学生接口进行学校选择
        # 拿到选择的学校的名字
        school_name = school_list[choice_school]
        # 调用接口
        flag, msg = student_interface.choose_school_interface(login_user_student['username'], school_name)

        # 对反馈的结果进行打印输出
        if flag:
            print(msg)
            login_user_student['school_name'] = school_name
            break
        else:
            print(msg)


# 选择课程
@common.auth('student')
def choose_course():
    while True:
        # （1）先获取当前的课程列表
        flag, courses_list = student_interface.get_course_list_interface(
            login_user_student['username'], login_user_student['school_name'])

        # （2）打印课程列表并让学生选择课程
        if not flag:
            print(courses_list)
            break

        # （2.1）遍历课程列表并打印
        for index, course_name in enumerate(courses_list):
            print(f'当前课程编号:>>>{index}  当前课程名字:>>>{course_name}')

        # （2.2）学生选择课程编号
        choice_course_name = input('请输入当前选择的课程编号:>>>>').strip()

        if choice_course_name == 'q':
            break

        # （2.3）判断是否为数字
        if not choice_course_name.isdigit():
            print(f'请输入正确的编号!!')
            continue

        choice_course_name = int(choice_course_name)

        # （2.3）判断是否在编号列表里
        if choice_course_name not in range(len(courses_list)):
            print(f'请输入正确的编号!!!')
            continue

        # （3） 根据课程编号拿到课程名字
        course_name = courses_list[choice_course_name]

        # （4）学生选择课程接口
        flag, msg = student_interface.student_choose_course_interface(login_user_student['username'], course_name)
        if flag:
            print(msg)
            break
        else:
            print(msg)


# 结算课程
@common.auth('student')
def pay_for_course():
    while True:
        # (1) 调用接口先获取所有的已选择的课程列表
        # 未选择课程
        flag, course_list = student_interface.student_select_course_list(login_user_student['username'])
        if not flag:
            print(course_list)
            break

        # 已选择课程
        for index, course_name in enumerate(course_list):
            print(f'当前课程编号:>>>{index}  课程名称:>>>{course_name}')

        # （2）查看课程详细信息
        course_name_chose = input('请输入选择查看的课程编号:>>>').strip()

        if course_name_chose == 'q':
            break

        if not course_name_chose.isdigit():
            print(f'请输入正确的指令编号!!!')
            continue

        course_name_chose = int(course_name_chose)

        if course_name_chose not in range(len(course_list)):
            print(f'请输入正确的编号!!')
            continue

        # 获取已选择的课程名称
        course_name = course_list[course_name_chose]
        # 获取已选择的课程名称的详细信息
        course_name, course_timestamp, course_price = student_interface.student_get_course_details(course_name)
        # 获取已选择的课程名称的付费状态
        flag_course, msg = student_interface.student_check_course_payed_interface(login_user_student['username'],
                                                                                  course_name)
        print(f'''
        ================当前课程详细信息如下====================
                    课程名称:>>>{course_name}
                    课程周期:>>>{course_timestamp}
                    课程价格:>>>{course_price}
                    课程状态:>>>{msg}
        ===============学完美课程,成就完美人生!=================
        ''')

        # 已付费课程不允许二次付费
        if flag_course:
            flow = f'已付费课程不允许二次缴费!!'
            print(flow)
            continue

        # 未付费课程调用付费课程接口进行付费
        # 输入付费金额
        payed_money = input('请输入缴费金额:>>>>').strip()

        if payed_money == 'q':
            break

        if not payed_money.isdigit():
            print('金额不合法!!!')

        payed_money = int(payed_money)

        if payed_money <= 0:
            flow = f'请确认输入金额!!'
            print(flow)

        # 调用付费接口
        flag, msg = student_interface.student_pay_for_course(
            login_user_student['username'], flag_course, course_name, course_price, payed_money)
        if flag:
            print(msg)
            break
        else:
            print(msg)
            continue


# 查看分数
@common.auth('student')
def check_score():
    # （1）调用学生接口层中的方法进行分数的查看
    flag, score_dict = student_interface.student_check_score_interface(login_user_student['username'])

    # （2）分数列表不存在则表示没有选课，进行选课
    if not flag:
        print(score_dict)

    for score_name, score_score in score_dict.items():
        print(f'''
                ================当前已选课程分数信息如下=================
                            课程名称:>>>{score_name}
                            课程分数:>>>{score_score}
                ===============学完美课程,成就完美人生!=================
                ''')


# 查看学生全部信息功能
@common.auth('student')
def check_student_details():
    while True:
        # （1）调用学生接口层查看学生的全部信息
        course_list, score_dict, msg_payed = student_interface.student_check_student_details_interface(
            login_user_student['username'])

        if not login_user_student['school_name']:
            print(f'''
                ================当前已选课程分数信息如下=================
                                  当前无学校入学!!
                ===============学完美课程,成就完美人生!=================
                                                              ''')
        else:
            print(f'''
                ================当前入学详细信息如下=================
                          当前已入学:>>>{login_user_student["school_name"]}
                ===============学完美课程,成就完美人生!=================
                                      ''')
        if not course_list:
            print(f'''
                ================当前已选课程分数信息如下=================
                                  当前没有选择课程!!
                ===============学完美课程,成就完美人生!=================
                                                  ''')
        else:
            for index, course_name in enumerate(course_list):
                # 获取已选择的课程名称的付费状态
                flag_course, msg = student_interface.student_check_course_payed_interface(
                    login_user_student['username'],
                    course_name)
                course_name, course_timestamp, course_price = student_interface.student_get_course_details(course_name)
                print(f'''
                ================当前已选课程详细信息如下=================
                              课程名称:>>>{course_name}
                              课程周期:>>>{course_timestamp}
                              课程价格:>>>{course_price}
                              课程状态:>>>{msg}
                ===============学完美课程,成就完美人生!=================
                          ''')
        if not score_dict:
            print(f'''
                ================当前已选课程分数信息如下=================
                                  请先选择并付费课程!!
                ===============学完美课程,成就完美人生!=================
                                      ''')
        else:
            check_score()
        break


func_menus = '''
 ================欢迎使用选课系统==================
                    1.注册
                    2.登陆
                    3.选择校区
                    4.选择课程
                    5.付费课程
                    6.查看分数
                    7.查看全部信息
 ===================q退出系统=======================
'''

func_dict = {
    '1': register,
    '2': login,
    '3': choose_school,
    '4': choose_course,
    '5': pay_for_course,
    '6': check_score,
    '7': check_student_details,
}


# 学生视图主函数
def student_view():
    while True:
        print(func_menus)

        choice = input('请输入功能编号:>>>>>').strip()
        print('温馨提示:>>输入q退出')

        if choice == 'q':
            break

        # 对输入的字符做判断：是否属于数字/是否属于字典内的编号范围
        elif not choice.isdigit() or choice not in func_dict:
            print('>>>>请输入正确的编号!!<<<<')
            continue

        # 根据功能编号，调用对应的功能
        func_dict[choice]()
